#include <iostream>

using namespace std;

const int N = 5e4 + 10;

typedef long long LL;

//x表示：最短跳跃距离 [1,L]
//c表示：在跳跃距离为x的情况下，移走的岩石数目
//最短跳跃距离越大，移走的岩石数目越多
//<---(c<=m)--- ret ---(c>m)-->
LL m, n, l;
LL a[N];

//当最短跳跃距离为x时，移走的岩石数目
LL calc(LL x)
{
	//用两个指针模拟跳跃的过程
	LL ret = 0;
	for(int i = 0; i <= n; i++)
	{
		int j = i + 1;
		while(j <= n && a[j] - a[i] < x) j++;
		ret += j - i - 1;
		i = j - 1;
	}
	return ret;
}

int main()
{
	cin >> l >> n >> m;
	for(int i = 1; i <= n; i++) cin >> a[i];
	a[n + 1] = l;
	n++;

	LL left = 1, right = l;
	while(left < right)
	{
		LL mid = left + (right - left + 1) / 2;
		if(calc(mid) <= m) left = mid;
		else right = mid - 1;
	}
	cout << left << endl;

	return 0;
}


